package com.ssm.changeunit.command;

import com.ssm.changeunit.persistance.ManagedItemListDAO;
import com.ssm.changeunit.persistance.ManagedItemListDTO;
import com.ssm.changeunit.persistance.PersistanceException;
import com.ssm.changeunit.util.FileUtil;
import com.ssm.changeunit.Environment;
import com.ssm.changeunit.persistance.DatabaseManager;
import java.io.File;
import org.apache.log4j.Logger;
import java.io.IOException;

/**
 * ChangeUnit의 "Add" Command를 처리하는 클래스입니다.
 * 
 * @date 2008-08-20
 * @author 시리우스
 */
public class AddCommandWorker extends CommandWorker {
    private Logger log = Logger.getLogger(AddCommandWorker.class);
    
    /**
     * 생성자
     * 
     * @date 2008-08-20
     * @author 시리우스
     */
    public AddCommandWorker () {
    }

    /**
     * 실제 작업을 처리하는 메서드
     * 
     * @date 2008-08-20
     * @author 시리우스
     */
    public void work (CommandWorkerOptions commandWorkerOptions) throws CommandWorkerException {
        if( commandWorkerOptions == null )
            throw new CommandWorkerException("Option이 null입니다.");
        
        if( !commandWorkerOptions.hasCommandWorkerOption("item") )
            throw new CommandWorkerException("Item Option이 존재하지 않습니다.");
        
        // Item option을 꺼내옵니다.
        CommandWorkerOption itemCommandWorkerOption = commandWorkerOptions.getCommandWorkerOption("item");
        
        // Item option에 해당하는 item들을 가져옵니다.
        String[] items = itemCommandWorkerOption.getValues();
        
        // item의 값이 없는 경우
        if( items.length == 0 )
            throw new CommandWorkerException("Item의 값이 존재하지 않습니다.");
        
        // 데이터베이스 체크
        log.debug("데이터베이스가 존재하는지 검사합니다.");
        
        try {
            if(!DatabaseManager.getInstance().isExists())
                throw new CommandWorkerException("데이터베이스가 존재하지 않습니다.");
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException(ex);
        }
        
        ManagedItemListDAO managedItemListDAO = new ManagedItemListDAO();
        
        // Item을 하나씩 꺼내 데이터베이스에 추가합니다.
        for(String item : items) {
            File itemFile = new File(item);
            
            // 존재하지 않으면 예외를 발생시킨다.
            if(!itemFile.exists()) 
                throw new CommandWorkerException("파일이 존재하지 않습니다. 파일 이름: " + item);
            
            if(itemFile.isDirectory()) 
                throw new CommandWorkerException("디렉토리는 저장할 수 없습니다. " + item);
            
            String relativeFilePath = "";
            
            // 파일의 경로 결정
            try {
                relativeFilePath = FileUtil.getRelativePath(itemFile, new File(Environment.ROOT_DIR));
                
                log.debug("추가되는 FilePath: " + relativeFilePath);
            }
            catch(IOException ex) {
                throw new CommandWorkerException(ex);
            }
            
            try {
                // 이미 데이터베이스에 존재하면 예외를 발생시킨다.
                if(managedItemListDAO.find(relativeFilePath) != null)
                    throw new CommandWorkerException("이미 존재하는 FilePath입니다. File Path: " + relativeFilePath);
            }
            catch(PersistanceException ex){
                throw new CommandWorkerException(ex);
            }
            
            // ManagedItemList 생성
            ManagedItemListDTO managedItemListDTO = new ManagedItemListDTO();
            
            // 파일의 경로 결정
            managedItemListDTO.setFilePath(relativeFilePath);
            
            // 데이터베이스에 삽입
            try {
                managedItemListDAO.insert(managedItemListDTO);
            }
            catch(PersistanceException ex){
                throw new CommandWorkerException(ex);
            }
        }
    }
}